package lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 悲观锁
 *      认为自己在使用数据的时候一定有别的线程来修改数据，因此在获取数据的时候会先加锁，确保数据不会被别的线程修改。
 *
 *      性能低下
 *      Java1.6为Synchronized做了优化，增加了从偏向锁到轻量级锁再到重量级锁的过度，
 *      但是在最终转变为重量级锁之后，性能仍然较低
 *
 *      悲观锁适合写操作多的场景，先加锁可以保证写操作时数据正确。
 *
 *
 *      lock类 与 synchronized关键字都是悲观锁
 *
 *
 *
 * @author Caleb
 * @date 2021/3/18 18:01
 * @description
 */
public class PessimismLock {

    private static Lock lock = new ReentrantLock();

    private static int count = 0;


    public static void main(String[] args) {
        // 创建两个线程
        for (int i = 0; i < 2; i++) {
            new Thread(() -> {
                try {
                    Thread.sleep(10);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //每个线程让count自增100次
                for (int k = 0; k < 100; k++) {
                        lock.lock();
                        count++;
                        lock.unlock();
                }
            }).start();
        }

        try{
            Thread.sleep(2000);
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println(count);
    }
}
